package find

import (
	"errors"
	"strings"
)

type IpLocation struct {
	Continent      string `json:"continent"`       //洲
	Country        string `json:"country"`         //国家/地区
	Province       string `json:"province"`        //省份
	City           string `json:"city"`            //城市
	District       string `json:"district"`        //区县
	Isp            string `json:"isp"`             //运营商
	AreaCode       string `json:"area_code"`       //区域代码
	CountryEnglish string `json:"country_english"` //国家/地区英文
	CountryCode    string `json:"country_code"`    //国家/地区英文简写
	Longitude      string `json:"longitude"`       //经度
	Latitude       string `json:"latitude"`        //纬度
	Elevation      string `json:"elevation"`       //海拔
	ZipCode        string `json:"zip_code"`        //邮编
	CityCode       string `json:"city_code"`       //城市代码
	WeatherStation string `json:"weather_station"` //气象站
	Asn            string `json:"asn"`
	Preserve       string `json:"preserve"`  //预留
	Street         string `json:"street"`    //街道
	TimeZone       string `json:"time_zone"` // 时区
}

type IpProxy struct {
	IsProxy   string `json:"is_proxy"`   //是否代理
	ProxyType string `json:"proxy_type"` //代理类型
	ProxyTime string `json:"proxy_time"` //代理时间
}

type IpScenes struct {
	ScenesCn string `json:"scenes_cn"` //应用场景
}

func NewLocation(locationStr string) (*IpLocation, error) {
	infos := strings.Split(locationStr, "|")
	if len(infos) < 14 {
		return nil, errors.New("查询格式出错或非归属地库")
	}
	// 洲|国家|省份|城市|区县|运营商|区域代码|预留|国家英文简写|经度|纬度|海拔|邮编|城市代码|气象站|ASN码|预留|街道|时区

	location := &IpLocation{
		Continent:      infos[0],
		Country:        infos[1],
		Province:       infos[2],
		City:           infos[3],
		District:       infos[4],
		Isp:            infos[5],
		AreaCode:       infos[6],
		CountryEnglish: infos[7],
		CountryCode:    infos[8],
		Longitude:      infos[9],
		Latitude:       infos[10],
		Elevation:      infos[11],
		ZipCode:        infos[12],
		CityCode:       infos[13],
		WeatherStation: infos[14],
		Asn:            infos[15],
		Preserve:       infos[16],
		Street:         infos[17],
		TimeZone:       infos[18],
	}
	return location, nil
}

func NewScenes(scenesStr string) (*IpScenes, error) {
	scenesCn := ""
	switch scenesStr {
	case "COM":
		scenesCn = "商业公司"
	case "EDU":
		scenesCn = "教育机构"
	case "GTW":
		scenesCn = "企业专线"
	case "GOV":
		scenesCn = "政府机构"
	case "NET":
		scenesCn = "基础设施"
	case "ORG":
		scenesCn = "组织机构"
	case "DYN":
		scenesCn = "家庭宽带"
	case "IDC":
		scenesCn = "数据中心"
	case "MOB":
		scenesCn = "移动网络"
	case "CDN":
		scenesCn = "内容分发"
	case "DNS":
		scenesCn = "域名解析"
	case "BOGON":
		scenesCn = "保留"
	default:
		scenesCn = "-" // 处理未匹配的情况
	}
	scenes := &IpScenes{
		ScenesCn: scenesCn,
	}
	return scenes, nil
}

func NewProxy(proxyStr string) (*IpProxy, error) {
	infos := strings.Split(proxyStr, "|")
	if len(infos) < 3 {
		return nil, errors.New("查询结果格式错误或非代理v2版本库")
	}
	proxy := &IpProxy{
		IsProxy:   infos[0],
		ProxyType: infos[1],
		ProxyTime: infos[2],
	}
	return proxy, nil
}
